package com.hubspot.baragon.service.resources; import java.util.Arrays; import java.util.List; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import com.amazonaws.AmazonClientException; import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient; import com.amazonaws.services.elasticloadbalancing.model.DeregisterInstancesFromLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.DeregisterInstancesFromLoadBalancerResult; import com.amazonaws.services.elasticloadbalancing.model.DescribeInstanceHealthRequest; import com.amazonaws.services.elasticloadbalancing.model.DescribeInstanceHealthResult; import com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancersRequest; import com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancersResult; import com.amazonaws.services.elasticloadbalancing.model.Instance; import com.amazonaws.services.elasticloadbalancing.model.InstanceState; import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerDescription; import com.amazonaws.services.elasticloadbalancing.model.RegisterInstancesWithLoadBalancerRequest; import com.amazonaws.services.elasticloadbalancing.model.RegisterInstancesWithLoadBalancerResult; import com.google.common.base.Optional; import com.google.inject.Inject; import com.google.inject.name.Named; import com.hubspot.baragon.auth.NoAuth; import com.hubspot.baragon.service.BaragonServiceModule; import com.hubspot.baragon.service.config.ElbConfiguration; import com.hubspot.baragon.service.exceptions.BaragonNotFoundException; import com.hubspot.baragon.service.exceptions.BaragonWebException; @Path("/elbs") @Produces(MediaType.APPLICATION_JSON) public class ElbResource { private final AmazonElasticLoadBalancingClient elbClient; private final Optional<ElbConfiguration> config; @Inject public ElbResource(@Named(BaragonServiceModule.BARAGON_AWS_ELB_CLIENT_V1) AmazonElasticLoadBalancingClient elbClient, Optional<ElbConfiguration> config) { this.elbClient = elbClient; this.config = config; } @GET @NoAuth public List<LoadBalancerDescription> getAllElbs() { if (config.isPresent()) { return elbClient.describeLoadBalancers().getLoadBalancerDescriptions(); } else { throw new BaragonWebException("ElbSync and related actions are not currently enabled"); } } @GET @NoAuth @Path("/{elbName}") public LoadBalancerDescription getElb(@PathParam("elbName") String elbName) { if (config.isPresent()) { try { DescribeLoadBalancersRequest request = new DescribeLoadBalancersRequest(Arrays.asList(elbName)); DescribeLoadBalancersResult result = elbClient.describeLoadBalancers(request); for (LoadBalancerDescription elb : result.getLoadBalancerDescriptions()) { if (elb.getLoadBalancerName().equals(elbName)) { return elb; } } } catch (AmazonClientException e) { throw new BaragonWebException(String.format("AWS Client Error: %s", e)); } throw new BaragonNotFoundException(String.format("ELB with name %s not found", elbName)); } else { throw new BaragonWebException("ElbSync and related actions are not currently enabled"); } } @GET @NoAuth @Path("/{elbName}/instances") public List<InstanceState> getInstancesByElb(@PathParam("elbName") String elbName) { if (config.isPresent()) { try { DescribeInstanceHealthRequest request = new DescribeInstanceHealthRequest(elbName); DescribeInstanceHealthResult result = elbClient.describeInstanceHealth(request); return result.getInstanceStates(); } catch (AmazonClientException exn) { throw new BaragonWebException(String.format("AWS Client Error %s", exn)); } } else { throw new BaragonWebException("ElbSync and related actions are not currently enabled"); } } @POST @Path("/{elbName}/update") public RegisterInstancesWithLoadBalancerResult addToElb(@PathParam("elbName") String elbName, @QueryParam("instanceId") String instanceId) { if (config.isPresent()) { RegisterInstancesWithLoadBalancerRequest request = new RegisterInstancesWithLoadBalancerRequest(elbName, Arrays.asList(new Instance(instanceId))); return elbClient.registerInstancesWithLoadBalancer(request); } else { throw new BaragonWebException("ElbSync and related actions are not currently enabled"); } } @DELETE @Path("/{elbName}/update") public DeregisterInstancesFromLoadBalancerResult removeFromElb(@PathParam("elbName") String elbName, @QueryParam("instanceId") String instanceId) { if (config.isPresent()) { DeregisterInstancesFromLoadBalancerRequest request = new DeregisterInstancesFromLoadBalancerRequest(elbName, Arrays.asList(new Instance(instanceId))); return elbClient.deregisterInstancesFromLoadBalancer(request); } else { throw new BaragonWebException("ElbSync and related actions are not currently enabled"); } } }